package ochart.utils
{
	
	public class ArrayUtil
	{
				
		/**	
		 *  确定指定的Array是否包含有指定的值
		 * 
		 *  @param 指定的Array
		 *
		 *  @param 要查找的值
		 * 
		 *  @return 返回是否有包含布尔值
		 */
		public static function containsValue(arr:Array, value:Object):Boolean
		{
			if(arr == null)
			{
				return false;
			}
			return (arr.indexOf(value) != -1);
		}	
		
		/**
		 *  移除Array中所有指定的值
		 * 
		 *  @param 要移除值的Array
		 *
		 *  @param 要移除的值
		 */
		public static function removeValue(arr:Array, value:Object):Array
		{
			var len:uint = arr.length;
			for(var i:Number = len; i > -1; i--)
			{
				if(arr[i] === value)
				{
					arr.splice(i, 1);
				}
			}
			return arr;
		}
		
		/**
		 *  移除Array中所有指定的值
		 * 
		 *  @param 要移除值的Array
		 *
		 *  @param 要移除的值
		 */
		public static function removeArray(arr:Array, value:Array):Array
		{
			for each(var object:Object in value)
			{
				ArrayUtil.removeValue(arr, object);
			}	
			return arr;
		}
		
		/**
		 *  创建一个只包含唯一值的Array
		 *  通常用于移除重复值
		 * 
		 *  @param 要移除重复值的Array
		 *
		 *  @return 一个只包含唯一值的Array
		 */
		public static function createUniqueCopy(a:Array):Array
		{
			var newArray:Array = new Array();
			
			var len:Number = a.length;
			var item:Object;
			
			for (var i:uint = 0; i < len; ++i)
			{
				item = a[i];
				
				if(ArrayUtil.containsValue(newArray, item))
				{
					continue;
				}
				
				newArray.push(item);
			}
			
			return newArray;
		}
		
		/**
		 *  复制一个Array
		 *  新的Array中的值和原Array的值是相同的引用而不是一个新的副本
		 * 
		 *  @param 将被复制的Array
		 *
		 *  @return 一个包含相同值的Array
		 */
		public static function copyArray(arr:Array):Array
		{	
			return arr.slice();
		}
		
		/**
		 *  从字符串中转换为Array
		 * 
		 *  @param 需要转换的字符串
		 * 
		 *  @param 分隔符
		 *
		 *  @return 一个包含相同值的Array
		 */
		public static function parseFromString(str:String, separator:String=","):Array
		{
			if(StringUtil.beginsWith(str, "["))
			{
				str = str.substring(1);
			}
			if(StringUtil.endsWith(str, "]"))
			{
				str = str.substring(0, str.length - 1);
			}

			var array:Array = str.split(separator);
			for(var i:int = 0; i < array.length; i++)
			{
				array[i] = StringUtil.trim(array[i]);
				if(StringUtil.beginsWith(array[i], "'"))
				{
					array[i] = array[i].substring(1);
				}
				if(StringUtil.endsWith(array[i], "'"))
				{
					array[i] = array[i].substring(0, array[i].length - 1);
				}
			}
			return array;
		}
		
		
		/**
		 *  将元素push到数组中的指定位置
		 * 
		 *  @param 数组
		 * 
		 *  @param 放置进数组的值
		 * 
		 *  @param 位置索引
		 *
		 *  @return 放置元素进去后的数组
		 */
		public static function putAt(arr:Array, index:int, value:Object):Array
		{
			if(arr == null || value == null)
			{
				return arr;
			}
			if(index < 1)
			{
				arr.unshift(value);
			}
			else if(index >= (arr.length))
			{
				arr.push(value);
			}
			else
			{
//				var leftArr:Array = arr.slice(0, index);
//				var rightArr:Array = arr.slice(index, arr.length);
//				
//				arr = new Array();
//				for each(var leftObject:Object in leftArr)
//				{
//					arr.push(leftObject);
//				}
//				arr.push(value);
//				for each(var rightObject:Object in rightArr)
//				{
//					arr.push(rightObject);
//				}
				arr.splice(index, 0, value);
			}
			return arr;
		}
		
		/**
		 *  将数组中所有元素放到指定数组中的指定位置
		 * 
		 *  @param 数组
		 * 
		 *  @param 放置进数组的数组
		 * 
		 *  @param 位置索引
		 *
		 *  @return 放置元素进去后的数组
		 */
		public static function putAll(arr:Array, value:Array, index:int=-1):Array
		{
			if(arr == null || value == null)
			{
				return arr;
			}
			if(index < 0)
			{
				index = 0;
			}
			for each(var object:Object in value)
			{
				arr = ArrayUtil.putAt(arr, index, object);
				index++;
			}
			return arr;
		}
		
		/**
		 *  比较两个Array是否包含相同的值并且排序相同
		 * 
		 *  @param 将要比较的Array
		 *
		 *  @param 将要比较的Array
		 *
		 *  @return 返回是否相同的布尔值
		 */
		public static function areEqual(arr1:Array, arr2:Array):Boolean
		{
			if(arr1.length != arr2.length)
			{
				return false;
			}
			
			var len:Number = arr1.length;
			
			for(var i:Number = 0; i < len; i++)
			{
				if(arr1[i] !== arr2[i])
				{
					return false;
				}
			}
			
			return true;
		}
	}
}
